<?php

/**
 * Description of Sjabloon
 * 
 * Dit is de hoofdklasse van het sjabloon gedeelte. Het sjabloon gedeelte bevat
 * alles wat onder zich zit. 
 *
 * @author Randy
 * @version 1.0
 * 
 * @category Cofely - Veiligheid & Gezondheids plan sjabloon
 * @uses TextObject, DbSjabloon, Risicoaandachtsgebied, Versie
 * 
 */
require_once 'defs/Constants.php';
include_once(FILE_CLASS_TPL_RISICOAANDACHT);
include_once(FILE_CLASS_VGP_VERSIE);
include_once(FILE_DB_SJABLOON);

class Sjabloon extends TextObject{
    
    /**
     * De array die alle risico aandachtsgebied bevat
     * @var array $risicoaandachtsgebied
     */
    private $risicoaandachtsgebied_array = array();
    /**
     * Bevat een lijst van alle sjablonen waarvan de status Final is
     * @var array $sjablonenlijst 
     */
    private $sjablonenlijst = array();
    /**
     * De laatste draft / preview uit de database
     * @var array $draft 
     */
    private $draft = array();
    /**
     * De huidige index van een risicoaandachtsgebied binnen de array
     * @var int $current_risicoaandachtsgebied_idx
     */    
    private $current_risicoaandachtsgebied_idx = '';
    /**
     * Het object van de versie klasse
     * @var Versie 
     */
    private $versie = '';
    /**
     * De versie id die door de Versie klasse wordt gegenereerd
     * @var int $versie_id 
     */
    private $versie_id = '';
    /**
     * De naam van het sjabloon die zelf wordt ingevuld
     * @var String $naam
     */
    private $naam = '';
    /**
     * De beschrijving van het sjabloon die zelf wordt ingevuld. Dit kan de naam van een bedrijf zijn
     * @var String $beschrijving
     */
    protected $beschrijving = '';
    /**
     * De laatste revisie die in de database staat
     * @var String $laatsteRevisie
     */
    private $laatsteRevisie = '';
    /**
     * De status van het sjabloon. Draft / Review / Final
     * @var String $status
     */
    private $status = '';
    /**
     * Het sjabloon dat op het scherm getoond gaat worden
     * @var array $sjabloon
     */
    private $sjabloon = array();
    /**
     * De constructor functie van Sjabloon. Als het risicoaandachtsgebied leeg is wordt er een beschrijving
     * aan toegevoegd
     * @param string $tpl_risicoaandachtsgebied 
     */    
    private $error_count = '';
    
    public function __construct($tpl_risicoaandachtsgebied = '' ){
        
        if(!empty($tpl_risicoaandachtsgebied)){
            $this->setBeschrijving($tpl_risicoaandachtsgebied);
        }
        
        $this->versie = new Versie();
    }
    /**
     * Setter van de sjabloonnaam
     * @param String $naam 
     */
    public function setNaam( $naam ){
        if ($this->controle->checkString($naam, DB_NUMBER_COMON_MAXIMUM, MINIMUM_ALGEMEEN)) {
            $this->naam = $naam;
        } else {
            $this->error_count++;
            echo WHITE_SPACE_ENTER;
            echo PERSOON_ERROR_GEENNAAM;
        }
    }
    /**
     * Setter van het de sjabloonbeschrijving
     * @param String $beschrijving 
     */
    public function setBeschrijving($beschrijving){
        if ($this->controle->checkString($beschrijving, DB_TEXT_OMSCHRIJVING, DB_TEXT_VOORLETTERS_MINIMUM)) {
            $this->beschrijving = $beschrijving;
        } else {
            $this->error_count++;
            echo WHITE_SPACE_ENTER;
            echo VOER_EEN_GELDIGE_OMSCHRIJVING_IN;
        }
    }
    /**
     * Getter van de sjabloonnaam, returned de naam
     * @return String $naam
     */
    public function getNaam(){
        
       return $this->naam; 
        
    }
    /**
     * Getter van de sjabloonbeschrijving, returned de beschrijving
     * @return String $beschrijving
     */
    public function getBeschrijving(){
        
        return $this->beschrijving;
        
    }
    /**
     * Getter van status
     * @return String $status
     */
    public function getStatus() {
        return $this->status;
    }
    /**
     * Setter van status
     * @param String $status 
     */
    public function setStatus($status) {
        if ($this->controle->checkString($status, DB_TEXT_LEIDING_MAXIMUM, DB_TEXT_VOORLETTERS_MINIMUM)) {
            $this->status = $status;
        } else {
            $this->error_count++;
            echo WHITE_SPACE_ENTER;
            echo VOER_EEN_GELDIGE_STATUS_IN;
        }
    }

     /**
     * Deze check functie kijkt of er een risicoaandachtsgebied is gemaakt. Zo niet krijg je een error.
     * @param type $risicoaandachtsgebiednaam
     * @return boolean 
     */
    public function check($risicoaandachtsgebiednaam){
        
        if(empty($risicoaandachtsgebiednaam)){
            echo SJABLOON_ERROR_LEEGRISICOAANDACHT;
            return false;
        }
    }
    
    public function checkError() {
        if($this->error_count != 0) {
            echo WHITE_SPACE_ENTER;
            echo GUI_FOUTEN_GEVONDEN_ERROR;
        } else {
            echo WHITE_SPACE_ENTER;
            echo GUI_GEEN_FOUTEN_GEVONDEN_ERROR;
            $new = new Sjabloon();
            $new->save();
        }
    }
    /**
     *
     * @param int $sjabloon_versie_id
     * @param String $sjabloon_beschrijving
     * @param int $change_pers_id
     * 
     * @todo $change_pers_id toevoegen bij de versie
     */
    public function save($sjabloon_versie_beschrijving, $sjabloon_beschrijving/*, $change_pers_id=''*/){
        
        /**
         *@todo Check de parameters 
         */
        
        //Haal de laatste versie uit de database
        $this->laatsteRevisie = $this->versie->getLaatsteRevisie();
        
        //Maak een nieuw revisie nummer
        $nieuwe_revisie = ceil($this->laatsteRevisie);
        
        
        
        //Set het versienummer en de versiebeschrijvingen
        $this->versie->setVersie_nr($nieuwe_revisie);
        $this->versie->setVersie_beschrijving($sjabloon_versie_beschrijving);
       
        if($this->versie->getVersie_nr() == $this->laatsteRevisie){
            echo( VG_SJABLOON_VERSION_ERROR . $this->laatsteRevisie );
            return false;
        }
        
        $this->versie->save();
        //Haal het laatst ingevoerde ID op uit de database
        $versie_id = $this->versie->db_versie->getVersie_id();
        
        //Maak een nieuwe instantie van DbSjabloon
        $db_sjabloon = new DbSjabloon();
        //Sla het versie_id met de sjabloon_beschrijving op in de database
        $db_sjabloon->save($versie_id, $sjabloon_beschrijving, VG_SJABLOON_STATUS_FINAL);
        
        //Voor elk risicoaandachtsgebied in de array sla je de versie_id, naam en beschrijving op
        foreach( $this->risicoaandachtsgebied_array as $idx => $obj){
            
            $this->risicoaandachtsgebied_array[$idx]->save( $versie_id, $obj->getNaam(), $obj->getBeschrijving() );
            
        }        
        
    }
    /**
     * Sla het sjabloon op als een draft met de aanpassingen (soort changelog) en de beschrijving van de draft
     */
    public function saveAsDraft($draft_beschrijving,$aanpassingen){
        
        //Maak een instantie van de DbSjabloon klasse zodat de functies daarvan
        //gebruikt kunnen worden.
        $db_draft = new DbSjabloon();      
        //Haal de nieuwste versie op uit de database.
        $this->laatsteRevisie = $this->versie->getLaatsteRevisie();
               
        
        //Geef de nieuwe draft een nieuwe subversie de laatste versie wordt dan
        //opgehoogt met 0.1 zodat je 1.1, 2.5 of wat daarop lijkt
        $draftVersie = $this->laatsteRevisie + 0.1;
        //Set het versienummer en de beschrijving van die versie. De beschrijving
        //kun je zien als een soort changelog
        $this->versie->setVersie_nr($draftVersie);
        $this->versie->setVersie_beschrijving($aanpassingen);
        //Foutafhandeling voor een dubbele versie. Een dubbele versie kan vrijwel
        //niet omdat de laatste altijd hierboven wordt opgehoogd met 0.1
        if($this->versie->getVersie_nr() == $this->laatsteRevisie){
            echo( VG_SJABLOON_VERSION_ERROR . $this->laatsteRevisie );
            return false;
        }
        
        //Sla de draft op.
        $this->versie->save();

        //Haal het opgeslagen ID op uit de database die wordt gebruikt voor het
        //opslaan van alles wat onder het hoogste niveau zit
        $versie_id = $this->versie->db_versie->getLaatsteVersieId();
        //Sla de gegevens van de draft op    
        $db_draft->save($versie_id, $draft_beschrijving, VG_SJABLOON_STATUS_DRAFT);
        
        //Sla alles op zoals je dat met een sjabloon zou doen
        foreach( $this->risicoaandachtsgebied_array as $idx => $obj){
            
            $this->risicoaandachtsgebied_array[$idx]->save( $versie_id, $obj->getNaam(), $obj->getBeschrijving() );
            
        }
        
    }
    /**
     * Sla een draft op als een preview 
     */
    public function saveAsPreview(){
        $versie_id = $this->versie->getLaatsteVersieId();
        $db_class = new DbSjabloon();
        $db_class->saveAsPreview($versie_id);
        
    }

    /**
     * Deze functie voegt een risicoaandachtsgebied-object toe aan de $risicoaandachtsgebied_array 
     * @param String $risicoaandachtsgebiednaam
     * @param String $risicoaandachtsgebiedbeschrijving 
     */
    public function addRisicoaandachtsgebied( $risicoaandachtsgebiednaam, $risicoaandachtsgebiedbeschrijving ){
        //check het risicoaandachtsgebiednaam
        $this->check($risicoaandachtsgebiednaam);
        //Maak een nieuw object in de array van TplRisicoaandachtsgebied
        $this->risicoaandachtsgebied_array[] = new TplRisicoaandachtsgebied();
        //Deze variabel geeft de huidige index van de array terug
        $this->current_risicoaandachtsgebied_idx = count($this->risicoaandachtsgebied_array)-1;
        // Zet de naam en beschrijving van het risicoaandachtsgebied
        $this->risicoaandachtsgebied_array[$this->current_risicoaandachtsgebied_idx]->setNaam($risicoaandachtsgebiednaam);
        $this->risicoaandachtsgebied_array[$this->current_risicoaandachtsgebied_idx]->setBeschrijving($risicoaandachtsgebiedbeschrijving);
        
    }
    /**
     * Deze functie voegt een risicogebied to aan de $risicoaandachtsgebied_array wanneer er een risicoaandachtsgebied is.
     * @param String $risicogebiednaam
     * @param String $risicogebiedbeschrijving 
     */
    public function addRisicogebied( $risicogebiednaam, $risicogebiedbeschrijving ){
        
        $this->risicoaandachtsgebied_array[$this->current_risicoaandachtsgebied_idx]->addRisicogebied($risicogebiednaam, $risicogebiedbeschrijving);
        
    }
    /**
     * Deze functie voegt een risico to aan de $risicoaandachtsgebied_array wanneer er een risicogebied is.
     * @param String $risiconaam
     * @param String $risicobeschrijving 
     */
    public function addRisico($risiconaam, $risicobeschrijving){
        
        $this->risicoaandachtsgebied_array[$this->current_risicoaandachtsgebied_idx]->addRisico( $risiconaam, $risicobeschrijving );
        
    }
    /**
     * Deze functie voegt een maatregel to aan de $risicoaandachtsgebied_array wanneer er een risico is.
     * @param type $maatregelnaam
     * @param type $maatregelbeschrijving 
     */
    public function addMaatregel( $maatregelnaam, $maatregelbeschrijving ){
        
        $this->risicoaandachtsgebied_array[$this->current_risicoaandachtsgebied_idx]->addMaatregel( $maatregelnaam, $maatregelbeschrijving );
        
    }
    
    public function changeStatus($status){
        
        $this->setStatus($status);
        
    }
        
    public function getAlleSjablonen(){
        $laatsteVersie = new Versie();
        
        //Haal alle data van een sjabloon op uit de database
        $db_sjabloon = new DbSjabloon();
        $this->sjablonenlijst = $db_sjabloon->getAlleSjablonen();
        
        //var_dump($this->sjablonenlijst);
        
        return $this->sjablonenlijst;
    }
    
    public function getLaatsteDraft(){
        
        $laatsteVersie = new Versie();
        
        //Haal alle data van een sjabloon op uit de database
        $db_draft = new DbSjabloon();
        $this->draft = $db_draft->getLaatsteDraft();
        
        //var_dump($this->sjablonenlijst);
        
        return $this->draft;                
    }
    
    public function getSjabloon($versie_nr){
         $db_sjabloon = new DbSjabloon();
         $this->sjabloon = $db_sjabloon->getSjabloon($versie_nr);
         return $this->sjabloon;
    }
}
